Vlakna - zpracovani zpravy vlakna v hlavnim vlakne - konci chybou
Otázka od: Ing. Jiri Sokol
19. 10. 2004 10:34
Ahoj.
Navazuji na svuj predchozi prispevek, tak se uz nebudu rozepisovat co a jak
delam. Jde o to, ze kdyz mi vlakno dojede na nejakou vyjimku, tak chci vyloucit
chyby, ktere by to mohlo zpusobovat nasledne a chtel bych toto vlykno, ktere
bezi porad ukonict, uvolnit a znovu vytvorit a pripravit ho na dalsi spusteni.
To jsem chtel resit tak, do hlavniho vlakna si poslu zpravu. Zpravu odchytim,
vim, ze je to s pozadavkem o:
Vlakno.Kill(INFINITE);
FreeAndNil(Vlakno);
a pak chci pokracovat
Vlakno.Create; (mam vlastni constructor), ale v nem to zhuci na vyjimku.
Jedine, jak to muzu provest je, ze jakmile hlavni vlakno aplikace odchyti
zpravu vlakna o jeho "reset", tak si samo na sebe posle jinou zpravu, ve ktere
se provedou ty zminene 3 radky uvedene vyse. VSE je OK...
Znamena to, ze kdyz mi prijde zpravy z nejakeho objektu, tak po dobu zpracovani
teto zpravy se NESMIM pokusit ten objekt zrusit a znovu vytvorit? Proc? Zpravy
si posilam pre POSTMessage, coz by melo znamenat, ze jdou asynchronne...
Muzete mi to, prosim, nekdo vyvsetlit?
Diky
Jirka
--------------------------------------------------
Ing. Jiri Sokol; jiri.sokol@seznam.cz; 972 231 187
D6Prof+SP3; WinXPProf+SP1; FB 1.5.0
programator amater
Odpovedá: Petr Fejfar
19. 10. 2004 10:49
Ing. Jiri Sokol wrote:
> Vlakno.Create; (mam vlastni constructor), ale v nem to zhuci na
> vyjimku.
A to je problem zjistit trasovanim popr. logovanim,
co se tam deje a kde a na jakou vyjimku to spadne?
pf
Odpovedá: delphin@post.cz
19. 10. 2004 10:13
> To jsem chtel resit tak, do hlavniho vlakna si poslu zpravu. Zpravu
odchytim, vim, ze je to s pozadavkem o:
> Vlakno.Kill(INFINITE);
> FreeAndNil(Vlakno);
> a pak chci pokracovat
> Vlakno.Create; (mam vlastni constructor), ale v nem to zhuci na vyjimku.
Nema tam byt spise TVlakno.Create ?
Odpovedá: Jiri Cincura
19. 10. 2004 10:54
Ing. Jiri Sokol wrote:
> Vlakno.Create; (mam vlastni constructor), ale v nem to zhuci na vyjimku.
Nemelo by spis byt Vlakno := Tvlakno.Create;
???
--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web:
http://www.cincura.net/
http://photo.cincura.net/
http://phorum.cincura.net/
---
A i kdyz je nase doba obtizna a zmatena, je podnetna a vyplnena
prilezitostmi. And if our times are difficult and perplexing, so are they
challenging and filled with opportunity. -Robert F. Kennedy, 1961
Odpovedá: Ing. Jiri Sokol
19. 10. 2004 12:54
> Od: Petr Fejfar <development@callnet.cz>
> Datum: 19.10.2004 11:53:22
>
> Ing. Jiri Sokol wrote:
>
> > Vlakno.Create; (mam vlastni constructor), ale v nem to zhuci na
> > vyjimku.
>
> A to je problem zjistit trasovanim popr. logovanim,
> co se tam deje a kde a na jakou vyjimku to spadne?
>
> pf
>
Ahoj.
Mam to vyzkouseno, ze se ta chyba 100% projevi - vem si ten priklad, kterym jsi
mi vysvetloval to workflow vlaken, misto semaphoru jsem dal event. Pak do
procedure TExclusiveThread._RequestExecute dej PostMessage(From1.Handle,
wm_user+10, self.ThreadID, 255);
V tele Form jedna jsem si dal jeden button, ktery mi udela:
Vlakno - globalni prommena TExclusiveThread
Vlakno:=TExclusiveThread.Create; (omlouvam se, ze jsem to v tech predchozich
pripevcich zvrtal, byl to jenom preklep - vytvarim ho proste takhle)
Vlakno.Resume;
Sleep(700);//jen aby nekdo nepojal podezreni, ze to je moc rychle
a konec
Ted mam vlkano, ktere jsem vytvoril, ktere se spustilo prave jednou probehlo
pres _Body a pres _RequestExecute a teda poslalo zpravu form1 a ted je ve stavu
klidu a ceka na zavolani udalosti.
ve form1 mam
type form1 = class (TFrom)
...
public
procedure VlaknoMes(var Mes: TMessage); message wm_user+10;
...
end;
procedure TForm1.VlaknoMes(var Mes: TMessage);
begin
if (Vlakno<>nil)and(Mes.WParam = Vlakno.ThreadID) then
begin
if Mes.LParam = 255 then
begin
Vlakno.Kill(INFINITE);
FreeAndNil(Vlakno);
Vlakno:=TExclusiveThread.Create; //<--- tohle se nikdy neprovede
//zkousel jsem i tohle:
// if Vlkano = nil then Vlakno:=TExclusiveThread.Create; //vysledek je stejny
end;
end;
end;
Pak to vzdycky konci tridu chyby EAccessViolation, chyba AccessViolation neco s
pameti na adrese... zhuci to pri vytvareni toho vlkana:
constructor TExclusive.Create;
begin
inherited Create(TRUE); //<--- presne tady
...
end;
Tak kde je zakopany pes?
Diky
JIrka
Odpovedá: Petr Fejfar
19. 10. 2004 15:20
Ing. Jiri Sokol wrote:
> Pak do procedure TExclusiveThread._RequestExecute dej
> PostMessage(From1.Handle, wm_user+10, self.ThreadID, 255);
Sice nevim, co je metoda _RequestExecute, ale pokud nemas
nejake podezrele akce (= zavisle na jinych prostredcich) u predka
toho threadu, tak konstrukce
Vlakno:=TExclusiveThread.Create; //<--- tohle se nikdy neprovede
musi vytvorit novou instanci threadu. Kdyz pada ten konstruktor na AV, tak
to spis vypada na nejaky prepis pameti apod.
pf